/// 定义 Circle 结构体
#[derive(Debug)]
struct Circle {
    // 定义 x 轴坐标
    #[doc = "x 轴坐标"]
    x: f64,
    // 定义 y 轴坐标
    #[doc = "y 轴坐标"]
    y: f64,
    ///定义半径
    radius: f64,
}

/// 定义 Circle 结构体
impl Circle {
    /// 定义构造函数
    fn new(x: f64, y: f64, radius: f64) -> Circle {
        Circle { x, y, radius }
    }
    /// 定义 area 方法
    fn area(&self) -> f64 {
        std::f64::consts::PI * (self.radius * self.radius)
    }
}

/// 定义 Rectangle 结构体
struct Rectangle {
    /// 定义宽度
    width: u32,
    /// 定义高度
    height: u32,
}

/// 定义 Rectangle 结构体的构造函数
impl Rectangle {
    /// 定义构造函数
    fn new(width: u32, height: u32) -> Rectangle {
        Rectangle { width, height }
    }
    /// 定义 area 方法
    fn area(&self) -> u32 {
        // 注意，不使用 return 时，下面表达式结束不能使用分号
        // 如果使用分号，前面必须使用 return 关键字明确指定返回值，如：
        // return self.width * self.height;
        self.width * self.height
    }
}

/// 多个 impl 定义
///
impl Rectangle {
    /// 定义 can_hold 方法
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

/// 为枚举实现方法
#[allow(unused)]
enum Message {
    /// 定义 Quit 变体
    Quit,
    /// 定义 Move 变体
    Move { x: i32, y: i32 },
    /// 定义 Write 变体
    Write(String),
    /// 定义 ChangeColor 变体
    ChangeColor(i32, i32, i32),
}

/// 为枚举实现方法
impl Message {
    /// 定义 call 方法
    fn call(&self) {
        println!("Message.call")
    }
}

/// 主函数
pub fn main() {
    let circle = Circle::new(5.0, 5.0, 2.5);
    println!("{}", circle.area());

    let rect1 = Rectangle {
        width: 15,
        height: 20,
    };
    let rect2 = Rectangle {
        width: 10,
        height: 15,
    };
    println!("{}", rect1.area());
    println!("{}", rect1.can_hold(&rect2));

    let m = Message::Write(String::from("Hello"));
    m.call();
}
